package com.mastercard.assets.web.forms.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.flows.process.FlowProcessContext;
import com.mastercard.assets.flows.process.FlowProcessInit;
import com.mastercard.assets.flows.process.FlowProcessPost;
import com.mastercard.assets.flows.process.FlowProcessPrevious;
import com.mastercard.assets.flows.process.FlowProcessResult;
import com.mastercard.assets.flows.to.FlowCampaignTO;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblGanador;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;
import java.text.SimpleDateFormat;

public class PreimplementationAvisarAGanadoresFormProcess
        implements
		FlowProcessInit , 
		FlowProcessPrevious , 
		FlowProcessPost
{
    
    public FlowProcessResult loadFormData( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;
		
		TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;
                
                TblAsset asset = tblTareaPreimplementacion.getTblAsset( ) ;
                
                List< TblPaquete > packDelAsset = new ArrayList< TblPaquete >( ) ;
                List< TblPaquete > packs =  campania.getTblPaquetes( ) ;
                List< TblGanador > ganadores = new ArrayList< TblGanador >( ) ;                
                
                for ( TblPaquete p : packs )
                {
                    if ( p.getTblAsset( ).getCveAsset( ) == asset.getCveAsset() )
                    {
                        packDelAsset.add( p ) ;
                    
                    
                            List< TblGanador > win = MasterCardDAO.getWinnerWithPackage( p.getCvePaquete( ) ) ;
                            
                            if ( win != null )
                            {
                                for ( TblGanador w : win )
                                {
                                    ganadores.add( w ) ;
                                }
                                
                            }
                            
                        
                    }
                    
                    
                }
                
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                String fecha1 , fecha2 , fecha3 , fecha4 , fecha5 , fecha6 ;
                
                int i = ganadores.size( ) , x = 0 ;
                // Declara los arreglos del form
                    String[] gNombre = new String[i] ; String[] gApellido = new String[i] ; String[] gFec_nac = new String[i] ;
                    String[] Email = new String[i] ; String[] Tel = new String[i] ; String[] Cel = new String[i] ;
                    String[] gPasaporte = new String[i] ; String[] gVigenciaIni = new String[i] ; String[] gVigenciaFin = new String[i] ;
                    String[] aNombre = new String[i] ; String[] aApellido = new String[i] ; String[] aFec_nac = new String[i] ;
                    String[] aPasaporte = new String[i] ; String[] aVigenciaIni = new String[i] ; String[] aVigenciaFin = new String[i] ;
                    String[] archivoBoleto = new String[i] ; int[] cveWin = new int[i] ;
                
                for ( TblGanador g : ganadores )
                    {
                       gNombre[x] = g.getGNombre( ) ;
                       gApellido[x] = g.getGApellido( ) ;
                       fecha1 = sdf.format( g.getGFecNacimiento( ) ) ;
                       gFec_nac[x] = fecha1 ;
                       Email[x] = g.getEmail( ) ;
                       Tel[x] = g.getTelFijo( ) ;
                       Cel[x] = g.getTelMovil( ) ;
                       gPasaporte[x] = g.getGPasaporte( ) ;
                       fecha2 = sdf.format( g.getGVigenciaInicio( ) ) ;
                       gVigenciaIni[x] = fecha2 ;
                       fecha3 = sdf.format( g.getGVigenciaFin( ) ) ;
                       gVigenciaFin[x] = fecha3 ;
                       aNombre[x] = g.getANombre( ) ;
                       aApellido[x] = g.getAApellido( ) ;
                       fecha4 = sdf.format( g.getAFecNacimiento( ) ) ;
                       aFec_nac[x] = fecha4 ;
                       aPasaporte[x] = g.getAPasaporte( ) ;
                       fecha5 = sdf.format( g.getAVigenciaInicio( ) ) ;
                       aVigenciaIni[x] = fecha5 ;
                       fecha6 = sdf.format( g.getAVigenciaFin() ) ;
                       aVigenciaFin[x] = fecha6 ;
                       
                       archivoBoleto[x] = g.getArchivoBoleto( ) ;
                       cveWin[x] = g.getCveGanador( ) ;
                       
                       x += 1 ;
                    }
		
		FlowCampaignTO to = new FlowCampaignTO( ) ;
		
		to.setCveFlow( tblFlujo.getCveFlujo( ) ) ;
		to.setFlow( tblFlujo ) ;
		to.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;
		to.setCampania( campania ) ;
                to.setGanadores( ganadores ) ;
                to.setPaquetes( packDelAsset ) ;
                to.setgNombre( gNombre ) ; to.setgApellido( gApellido ) ; to.setgFec_nac( gFec_nac ) ; to.setEmail( Email ) ;
                to.setTel( Tel ) ; to.setCel( Cel ) ; to.setgPasaporte( gPasaporte ); to.setgVigenciaIni( gVigenciaIni ) ;
                to.setgVigenciaFin( gVigenciaFin ) ; to.setaNombre( aNombre ) ; to.setaApellido( aApellido ) ;
                to.setaFec_nac( aFec_nac ) ; to.setaPasaporte( aPasaporte ) ; to.setaVigenciaIni( aVigenciaIni ) ;
                to.setaVigenciaFin( aVigenciaFin ) ; to.setArchivoBoleto( archivoBoleto ) ; to.setCveWin( cveWin ) ;
                
		//to.setWithFile( true ) ;
		
		// extrae la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		// extrae la forma
		TblForma forma = tarea.getTblForma( ) ;
		
		// nombre del jsp
		String jspName = forma.getArchivoForma( ) ;
		// ruta completa del jsp
		URL ruta = null ;
		try
		{
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			ruta = new URL( "file" , "localhost" , MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + ruta ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_OBTAINING_PATH , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorCalculatingPath" , e.getMessage( ) ) , e ) ;
		}
		
//		String jspPath = ruta.getQuery( ) ;
		String jspPath = "/WEB-INF/formas/" + jspName ;
		
		System.out.println( "FlowUtil.java: jspPath/" + jspPath ) ;
		
		java.util.List< TblAsset > assets = new ArrayList< TblAsset >( ) ;
		java.util.List< TblAsset > assetsDelFlujo = tblPreimplementacion.getTblAssets( ) ;
		
		// recorre assets
		for( TblAsset asset1 : assetsDelFlujo )
			// en caso de que este activo
			if( asset1.getStatus( ) == 1 )
				assets.add( asset1 ) ;
		
		// coloca en el to
		to.setAssets( assets ) ;
		
		// abre el archivo
		File dir = new File( MCUtil.getFormsDir( ) ) ;
//		System.out.println( "***********" + dir.getAbsolutePath( ) ) ;
		File f = new File( dir , jspName ) ;
//		System.out.println( "***********" + f.getAbsolutePath( ) ) ;
		
//		System.getProperties( ).list( System.out ) ;
		
		String fileCode = "" ;
		StringBuffer sb = new StringBuffer( ) ;
		
		try
		{
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/" ) ;
			BufferedReader rIn = new BufferedReader( new FileReader( f ) ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/1" ) ;
			String line = "" ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/2" ) ;
			while( ( line = rIn.readLine( ) ) != null )
				sb.append( line ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/3" ) ;
			rIn.close( ) ;
			
			System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/4" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			MasterCardDAO.closeEntityManager( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_NO_FORM_FILE_EXIST , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFormFileExist" , jspName ) , e ) ;
		}
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: lecturaJSP/5" ) ;
//		System.out.println( sb.toString( ) ) ;
		
		// coloca la ruta del jsp
		to.setJspPath( jspPath ) ;
		to.setJspCode( sb.toString( ) ) ;
		
		sb.setLength( 0 ) ;
		sb = null ;
		
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to/" + to ) ;
		System.out.println( "PreimplementationEntregaMaterialesFormProcess.java: to.getError/" + to.getError( ) ) ;
			
                MasterCardDAO.closeEntityManager( ) ;
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY , to ) ;
	}
	
	public FlowProcessResult canDisplay( FlowProcessContext ctx )
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		// en caso de uqe ya este ejecutado
		if( tblTareaPreimplementacion.getEjecutado( ) == 1 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_EXECUTED ) ;
		
		// toma las clases para procesar la forma antes de desplegarla
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		String nombreTarea = tarea.getNombre( ) ;
		
		// en caso de que la tarea haya sido desactivada
		if( tarea.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_DESACTIVATED ) ;
		
		// toma la forma a la que esta ligada la tarea
		TblForma forma = tarea.getTblForma( ) ;
		
		// en caso de que la forma este desactivada
		if( forma.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_FORM_DESACTIVATED ) ;
		
		/// se pueden agregar mas filtros
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY ) ;
	}
	
	 public FlowProcessResult processExit( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		
		int stepupResult = -1 ;
		
		// procesa los datos
		// los guarda en BD
		try
		{
			HttpServletRequest request = ctx.getRequest( ) ;
			
			String comentarios = request.getParameter( "comentarios" ) ;
			
			if( comentarios == null )
				comentarios = "" ;
                        
                        MasterCardDAO.stepUpWorkFlow( ctx.getUser( ) , ctx.getCveTareaPreimplementacion( ) , ctx.getForm( ).getExit( ) , ctx.getUser( ).getCveUsuario( ) ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			e.printStackTrace( ) ;
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
		}
                MasterCardDAO.closeEntityManager( ) ;
				
                return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS ) ;
	}
    
}
